/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package manager.modulo.sistema.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import manager.auxiliares.MensagemExcessao;
import manager.interfaces.InterfaceDao;
import manager.principal.fonte.JanelaLogin;

/**
 *
 * @author Thiago
 */
public class ModuleDao implements InterfaceDao {

    private int idModulo;
    private int idUsuario;

    /**
     * Retorna os modules do sistema ao qual o usuário tem acesso.
     *
     * @param idUser Id do usuário a ser buscado
     * @return Lista com os módulos do sistema que o usuário tem acesso.
     * @throws SQLException
     */
    public static LinkedList<String> modulesByIdUser(int idUser) throws SQLException {
        String sql = "SELECT m.tx_nome as nome "
                + " FROM "
                + " mod_usu mu,"
                + " modulo m"
                + " WHERE "
                + " mu.id_usuario = ? AND"
                + " m.id = mu.id_modulo";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setInt(1, idUser);
        ResultSet resultSet = preparedStatement.executeQuery();

        LinkedList<String> modules = new LinkedList<String>();

        while (resultSet.next()) {
            modules.add(resultSet.getString("nome"));
        }
        resultSet.close();
        preparedStatement.close();
        return modules;
    }

    /**
     * Inserir as permissões de modulos para um usuários
     *
     * @param modules Modules que serão concedidas as permissões
     * @param idUsuario Id do usuário que receberá as permissões
     */
    public static void insertModulePermission(LinkedList<String> modules, int idUsuario) throws SQLException {
        LinkedList<Integer> idMoludos = ModuleDao.idModulesByName(modules);
        ModuleDao moduleDal = null;
        for (int i = 0; i < idMoludos.size(); i++) {
            moduleDal = new ModuleDao();
            moduleDal.setIdModulo(idMoludos.get(i));
            moduleDal.setIdUsuario(idUsuario);
            moduleDal.inserir();
        }
    }

    /**
     * Retorna uma lista de ids a partis dos nomes dos módulso passados como
     * parâmetro
     *
     * @param modules Lista com nome dos módulos a serem inseridos
     * @return Lista de ids de módulos
     * @throws SQLException
     */
    private static LinkedList<Integer> idModulesByName(LinkedList<String> modules) throws SQLException {
        LinkedList<Integer> result = new LinkedList<Integer>();
        if (modules.size() > 0) {//Verifica se precisa inserir permissão para algum módulo
            String whereClause = "";
            for (int i = 0; i < modules.size(); i++) {
                if (i == 0) {
                    whereClause += "'" + modules.get(i) + "'";
                } else {
                    whereClause += ",'" + modules.get(i) + "'";
                }
            }
            whereClause = "(" + whereClause + ")";
            String sql = "SELECT id FROM modulo WHERE tx_nome IN " + whereClause;
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                result.add(resultSet.getInt("id"));
            }
            resultSet.close();
            preparedStatement.close();
        }
        return result;
    }

    /**
     * Insere um registro para as tabela module_user
     */
    public void inserir() {
        try {
            String sql = "INSERT INTO mod_usu (id_modulo,id_usuario) VALUES(?,?)";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);

            preparedStatement.setInt(1, idModulo);
            preparedStatement.setInt(2, idUsuario);
            preparedStatement.executeUpdate();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Inserindo Permissões");
        }
    }

    public void atualizar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void buscar(int id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * Deleta todos registros de permissão de módulo que o usuário com o id =
     * idUser possui
     *
     * @param idUser Id do usuário que terá as permissões excluidas
     * @throws SQLException
     */
    public static void deletePermissions(int idUser) throws SQLException {
        String sql = "DELETE FROM mod_usu WHERE id_usuario = ? ";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setInt(1, idUser);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    /**
     * Todos os módulos do sistema
     *
     * @return Lista com todos os módulos do sistema
     * @throws SQLException
     */
    public static LinkedList<String> systemModules() throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        String sql = "SELECT tx_nome FROM modulo";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            result.add(resultSet.getString(1));
        }
        resultSet.close();
        preparedStatement.close();
        return result;
    }

    public void deletar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getIdModulo() {
        return idModulo;
    }

    public void setIdModulo(int idModulo) {
        this.idModulo = idModulo;
    }

    public int getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(int idUsuario) {
        this.idUsuario = idUsuario;
    }

    public LinkedList<String> buscar(String opcao, String buscado, boolean limite) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
